let id = 0;

// 属性的dep用于收集watcher
class Dep {
  constructor() {
    this.id = id++;

    // 这里存放着当前属性对应的watcher有哪些
    this.wats = [];
  }

  // dep收集watch
  depend() {
    // 如果有相同的属性会重复收集，注意去重
    // 把当前的watcher放入栈中
    // this.wats.push(wat); //会重复

    // watcher记住dep，通过addDep再让dep收集watcher
    //   > 双向标记
    Dep.target.addDep(this);
    // dep和watcher是一个多对多的关系
    // 一个属性可以在多个组件中使用 （dep ->多个watcher）
    // 一个组件中由多个属性组成（一个watcher对应多个dep）
  }

  // dep记住watcher
  addWats(wat) {
    this.wats.push(wat);
  }

  notify() {
    // 告诉watcher要更新了
    this.wats.forEach((watcher) => {
      watcher.update();
    });
  }
}

Dep.target = null;

// 多比以前维护一个栈形结构
let stack = [];
export function pushTarget(watcher) {
  stack.push(watcher);
  Dep.target = watcher;
}

export function popTarget() {
  stack.pop();
  Dep.target = stack[stack.length - 1];
}

export default Dep;
